package com.sophossystems.client.asmon.dao.spring;

import java.sql.SQLException;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate3.HibernateCallback;

import com.sophossystems.client.asmon.dao.MunicipiosDao;
import com.sophossystems.client.asmon.dto.MunicipiosDTO;
import com.sophossystems.client.asmon.exceptions.DaoException;

public class MunicipiosDaoImpl extends AbstractDAO implements MunicipiosDao {
	
	private static Logger logger = Logger.getLogger(MunicipiosDaoImpl.class);

	@Override
	public MunicipiosDTO findById(final int idMunicipio) throws DaoException {
		MunicipiosDTO exito = null;
		try {
			exito = (MunicipiosDTO) getHibernateTemplate().execute(new HibernateCallback() {
				
				@Override
				public Object doInHibernate(Session session) throws HibernateException,
						SQLException {
					final Query oQuery = session.createQuery("SELECT m.idMunicipio as idMunicipio, m.nombreMunicipio as" +
							" nombreMunicipio, m.cpInicio as cpInicio, m.cpFinal as cpFinal FROM " + 
							getTableName() + " m WHERE m.idMunicipio = :idMunicipio");
					oQuery.setInteger("idMunicipio", idMunicipio);
					MunicipiosDTO municipiosDto =  (MunicipiosDTO) oQuery.setResultTransformer(Transformers.aliasToBean(
							MunicipiosDTO.class)).list().get(0);
					return municipiosDto;
				}
			});
		} catch (Exception e) {
			logger.debug("Error FindByIdMunicipio, causa: " + e.getCause());
			throw new DaoException("Error FindByIdMunicipio, causa: " + e.getCause());
		}
		return exito;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<MunicipiosDTO> findAll() throws DaoException {
		List<MunicipiosDTO> exito = null;
		try {
			exito = (List<MunicipiosDTO>) getHibernateTemplate().execute(new HibernateCallback() {
				
				@Override
				public Object doInHibernate(Session session) throws HibernateException,
						SQLException {
					final Query oQuery = session.createQuery("SELECT m.idMunicipio as idMunicipio, m.nombreMunicipio as" +
							" nombreMunicipio, m.cpInicio as cpInicio, m.cpFinal as cpFinal FROM " + 
							getTableName() + " m");
					List<MunicipiosDTO> municipiosDto =   oQuery.setResultTransformer(Transformers.aliasToBean(
							MunicipiosDTO.class)).list();
					return municipiosDto;
				}
			});
		} catch (Exception e) {
			logger.debug("Error FindAll Municipio, causa: " + e.getCause());
			throw new DaoException("Error FindAll Municipio, causa: " + e.getCause());
		}
		return exito;
	}

	public String getTableName() {
		return "Municipios";
	} 
}
